【小ネタ】 AWS CloudFormationテンプレートでAWSアカウントごとにリソース作成有無を決定する
AWS CloudFormation(CFn) StackSetを使っていて、 「特定のAWSアカウントには、このリソースを作りたくない」要件がでてきました。
Conditions を使って、これを解決してみます。
CFnで使える条件(Conditions
)
CFnの Conditions
セクションを使ってリソースの作成有無を決定することができます。
シンプルな例を紹介します。
AWSTemplateFormatVersion: '2010-09-09' Parameters: Env: Type: String AllowedValues: - prod - dev Conditions: CreateProdResources: !Equals - !Ref Env - prod Resources: # This topic is only needed in production workloads. SNSTopic: Type: AWS::SNS::Topic Condition: CreateProdResources Properties: TopicName: !Sub ${Env}-topic
Parameters
セクションで指定したパラメータ Env
の値によって、
リソースである SNSTopic
の作成有無を決定する例です。
Env=prod
のとき、SNSTopic
は作成されますEnv=dev(prod以外)
のとき、SNSTopic
は作成されません
Conditions
では条件関数を使って、真偽の決定プロセスを定めます。
今回は Fn::Equals を使っています。
詳しい使い方や他の条件関数については以下参照ください。
アカウントごとにリソース作成有無を分ける
以下のようなテンプレートで実現できます。
AWSTemplateFormatVersion: '2010-09-09' Mappings: AccountParams: "111111111111": { CreateResources: yes } "222222222222": { CreateResources: yes } "333333333333": { CreateResources: no } Conditions: CreateResources: !Equals - !FindInMap [AccountParams, !Ref "AWS::AccountId", CreateResources] - yes Resources: SNSTopic: Type: AWS::SNS::Topic Condition: CreateResources Properties: TopicName: hoge-topic
Mappings を活用しました。
Mappings
を使うことで AWSアカウントごとに異なるパラメータを
指定することができます。
※ Mappings
, FindInMap
などの使い方については以下に記載しているので参照ください。